package com.linchong.jvm.execute;

import lombok.extern.slf4j.Slf4j;

/**
 * @author linchong
 * @version 1.0
 * @Date: 2020-11-16 22:08
 * @Description: StackFrame$栈帧
 */
@Slf4j
public class StackFrame {




	public int add(int a, int b) {
		int c = a + b;
		return a + b + c;
		//slot 变量槽排序,即局部变量表中的槽位分布：
		//0--this
		//1--a
		//2--b
		//3--c
	}

	public static void main(String[] args) {
		//testOperateStack();
		//testMethodInvoke();

	}

	private static void testMethodInvoke() {
		StackFrame stackFrame = new StackFrame();
		int ret = stackFrame.add(1,2);
		log.info("result:{}",ret);
	}

	private static void testOperateStack() {
		{
			byte[] bs = new byte[1 * 1024 * 1024];
			byte[] bs2 = new byte[1 * 1024 * 1024];
			//方法2.局部变量表中显示的使用=null
			bs = null;
		}
		//方法1.使用变量去覆盖槽位
//		int a = 4;
//		int b = 5;
		System.gc();

		//slot:
		// 静态方法。0-args
		// 1---bs---堆的空间，存放2M的数据
		//触发GC时，隐含当前还有人在用，即本地变量表
		//加上a的定义后，出了{}局部变量块后，理论而言，插槽1不在被使用，故变量a复用插槽1的位置。
		//1--a,覆盖了bs
		log.info("totalMemory:【{}】M",Runtime.getRuntime().totalMemory()/1024.0/1024);
		log.info("freeMemory:【{}】M",Runtime.getRuntime().freeMemory()/1024.0/1024.0);
		log.info("maxMemory:【{}】M",Runtime.getRuntime().maxMemory()/1024.0/1024.0);
	}

}
